home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / demos / vectors_colormorph / filledvectors.s next >
Text File  |  1980-01-03  |  28KB  |  1,134 lines

  1.  
  2.  
  3. wblt    MACRO            ; "wblt" als Macro definieren
  4.  
  5. \@ btst #6,$dff002        ; \@ = Label, das bei jedem Macro-Aufruf einen
  6.    bne.s \@            ; anderen Namen trägt
  7.  
  8.     ENDM
  9.  
  10. Start:
  11.  move.w #$4000,$dff09a        ; Interrupts sperren
  12.  bsr.s init            ; Initialisierung
  13.  bsr DoVector            ; HauptRoutine
  14.  wblt
  15.  move.l 4.w,a6            ; System wieder herholen
  16.  lea gfxname(pc),a1
  17.  jsr -408(a6)
  18.  move.l d0,a1
  19.  move.l 38(a1),$dff080
  20.  move.w d0,$dff088
  21.  jsr -414(a6)
  22.  move.l screen(pc),a1
  23.  move.l #$12000,d0
  24.  jsr -210(a6)
  25.  move.l oldvbi(pc),$6c.w
  26.  move.w intena(pc),d0
  27.  or.w #$8000,d0
  28.  move.w #$7fff,$dff096
  29.  move.w #$83f0,$dff096
  30.  move.w #$7fff,$dff09c
  31.  move.w d0,$dff09a
  32.  moveq #0,d0
  33.  rts
  34.  
  35. init:                ; INITIALISIERUNG
  36.  move.l 4.w,a6
  37.  move.l #$12000,d0
  38.  move.l #$30002,d1
  39.  jsr -198(a6)            ; ChipRAM
  40.  move.l d0,screen        ; er reicht doch?
  41.  lea $dff000,a6            ; Register-Init
  42.  move.w #$7fff,$96(a6)
  43.  move.l #0,$144(a6)
  44.  move.l #copperlist,$80(a6)
  45.  move.w d0,$88(a6)
  46.  move.l #$2c812cc1,$8e(a6)
  47.  move.l #$3800d0,$92(a6)
  48.  move.l #0,$102(a6)
  49.  move.l #0,$108(a6)
  50.  move.w #$3200,$100(a6)
  51.  move.l d0,a0            ; Bildschirm-Seiten
  52.  move.l a0,a1
  53.  add.l #$12000,a1
  54.  move.l d0,pgh
  55.  add.l #$8000,d0
  56.  move.l d0,pgs
  57.  add.l #$8000,d0
  58.  move.l d0,tmpadr
  59.  moveq #0,d0
  60. clrlp:
  61.  move.l d0,(a0)+
  62.  cmp.l a1,a0
  63.  blt.s clrlp
  64.  move.l #rottab+2,rotptr
  65.  move.w rottab(pc),rotcnt
  66.  bsr dorot            ; bei Verwendung eigener Objekte entfernen!
  67.  move.l $6c.w,oldvbi        ; Interrupt-Init
  68.  move.l #vbiserver,$6c.w
  69.  move.w $1c(a6),intena
  70.  move.w #$7fff,$9a(a6)
  71.  move.w #$c020,$9a(a6)        ; Nur VBI erlauben
  72.  move.w #$87c0,$96(a6)
  73.  rts
  74.  
  75. vbiserver:            ; INTERRUPT
  76.  movem.l d0-d7/a0-a6,-(a7)
  77.  lea $dff000,a6
  78.  bsr joy            ; Joystick-Abfrage
  79.  bsr rotob            ; Mutation des Rotations-Körpers (bei Ver-
  80.                                 ; wendung eigener Objekte entfernen!)
  81.  move.w #1,vbi
  82.  move.w #$20,$9c(a6)
  83.  movem.l (a7)+,d0-d7/a0-a6
  84.  rte
  85.  
  86. joy:                ; JOYSTICK
  87.  move.w $dff00c,d0
  88.  btst #1,d0
  89.  bne.s right
  90.  btst #9,d0
  91.  bne.s left
  92. testud:
  93.  move.w d0,d1
  94.  lsr.w d1
  95.  eor.w d1,d0
  96.  btst #0,d0
  97.  bne.s bckw
  98.  btst #8,d0
  99.  bne.w forw
  100.  rts
  101. right:                ; rechts
  102.  btst #7,$bfe001        ; rechts + Feuer ?
  103.  bne.s nfr
  104.  addq.w #6,rzb            ; Feuer -> z-rot + 3°
  105.  cmp.w #720,rzb
  106.  blt.s ok1
  107.  move.w #0,rzb
  108. ok1:
  109.  bra.s testud
  110. nfr:                ; kein Feuer -> y-rot + 3°
  111.  addq.w #6,ryb
  112.  cmp.w #720,ryb
  113.  blt.s ok
  114.  move.w #0,ryb
  115. ok:
  116.  bra.s testud
  117. left:                ; links
  118.  btst #7,$bfe001        ; links + Feuer ?
  119.  bne.s nfrl
  120.  subq.w #6,rzb            ; Feuer -> z-rot - 3°
  121.  bge.s ok11
  122.  add.w #720,rzb
  123. ok11:
  124.  bra.s testud
  125. nfrl:
  126.  subq.w #6,ryb            ; kein Feuer -> y-rot - 3°
  127.  bne.s ok21
  128.  add.w #720,ryb
  129. ok21:
  130.  bra testud
  131. bckw:                ; zurück
  132.  btst #7,$bfe001        ; zurück + Feuer
  133.  bne.s nfr2
  134.  cmp.l #-5000,addzb        ; Feuer -> 1000 Punkte näher ran
  135.  bge.s ok22
  136.  add.l #1000,addzb
  137. ok22:
  138.  rts
  139. nfr2:                ; kein Feuer -> x-rot - 3°
  140.  subq.w #6,rxb
  141.  bge.s ok23
  142.  add.w #720,rxb
  143. ok23:
  144.  rts
  145. forw:                ; vorwärts
  146.  btst #7,$bfe001        ; vorwärts + Feuer
  147.  bne.s nfr3
  148.  cmp.l #-250000,addzb        ; Feuer -> 1000 Punkte weiter weg
  149.  ble.s ok24
  150.  sub.l #1000,addzb
  151. ok24:
  152.  rts
  153. nfr3:                ; kein Feuer -> x-rot + 3°
  154.  addq.w #6,rxb
  155.  cmp.w #720,rxb
  156.  blt.s ok25
  157.  move.w #0,rxb
  158. ok25:
  159.  rts
  160.  
  161. DoVector:            ; HAUPT-ROUTINE
  162.  movem.l d2-d7/a2-a6,-(a7)
  163. vcloop:                ; warten auf VBI
  164.  tst.w vbi
  165.  beq.s vcloop
  166.  move.w #-1,drawnum
  167.  bsr clrscreen            ; Bildlöschen starten
  168.  bsr vector            ; Berechnung und Zeichnung
  169.  move.w #0,vbi
  170.  btst #6,$bfe001        ; Left Mouse Button ?
  171.  bne.s vcloop
  172.  movem.l (a7)+,d2-d7/a2-a6
  173.  rts
  174.  
  175. clrscreen:            ; BILDLÖSCHEN
  176.  movem.l pgh,d0-d1        ; Page Flipping
  177.  move.l d0,pgs            ; für Double Buffering
  178.  move.l d1,pgh
  179.  lea page,a0            ; neue Seiten in CopperList
  180.  move.w d0,6(a0)
  181.  swap d0
  182.  move.w d0,2(a0)
  183.  swap d0
  184.  add.l #148*40,d0
  185.  move.w d0,14(a0)
  186.  swap d0
  187.  move.w d0,10(a0)
  188.  swap d0
  189.  add.l #148*40,d0
  190.  move.w d0,22(a0)
  191.  swap d0
  192.  move.w d0,18(a0)
  193.  movem.l addxb(pc),d0-d4    ; gebufferte Joystickbewegungen
  194.  movem.l d0-d4,addx        ; für gültig erklären.
  195.  move.w #$4000,$9a(a6)        ; Int's sperren (falls Blitter auch im VBI
  196.  wblt                ; gebraucht würde)
  197.  moveq #-1,d0
  198.  move.l d0,$44(a6)
  199.  move.w #0,$66(a6)
  200.  move.l #$1000000,$40(a6)
  201.  move.l pgh(pc),$54(a6)
  202.  move.w #148*3*64+(40/2),$58(a6); Starten des Löschens
  203.  move.w #$c000,$9a(a6)
  204.  rts
  205.  
  206. quicksort:            ; QUICKSORT-Algorithmus
  207.  moveq #0,d4
  208.  move.l #ztab,d5
  209.  lea lrtab(pc),a0
  210.  lea dttab(pc),a1
  211.  move.l d5,0(a0,d4.w)
  212.  move.l zend(pc),a5
  213.  move.l a5,4(a0,d4.w)
  214. l20:
  215.  move.l 0(a0,d4.w),d5
  216.  move.l 4(a0,d4.w),a5
  217.  subq.w #8,d4
  218. l30:
  219.  move.l d5,a2
  220.  move.l a5,a3
  221.  move.l a2,d1
  222.  sub.l #ztab,d1
  223.  move.w d1,d3
  224.  add.w d1,d1
  225.  add.w d3,d1
  226.  asr.w #1,d3
  227.  add.w d3,d1
  228.  move.l a3,d2
  229.  sub.l #ztab,d2
  230.  move.w d2,d3
  231.  add.w d2,d2
  232.  add.w d3,d2
  233.  asr.w #1,d3
  234.  add.w d3,d2
  235.  move.l d5,d0
  236.  add.l a5,d0
  237.  asr.l #3,d0
  238.  asl.l #2,d0
  239.  move.l d0,a6
  240.  move.l (a6),d3
  241. l40:
  242.  cmp.l (a2),d3
  243.  ble.s l41
  244.  addq.l #4,a2
  245.  add.w #14,d1
  246.  bra.s l40
  247. l41:
  248.  cmp.l (a3),d3
  249.  bge.s l42
  250.  subq.l #4,a3
  251.  sub.w #14,d2
  252.  bra.s l41
  253. l42:
  254.  cmp.l a3,a2
  255.  bgt.s l50
  256.  move.l (a3),d0
  257.  move.l (a2),(a3)
  258.  move.l d0,(a2)
  259.  exg.l d0,d5
  260.  movem.l 0(a1,d1.w),d5-d7
  261.  move.l 0(a1,d2.w),0(a1,d1.w)
  262.  move.l 4(a1,d2.w),4(a1,d1.w)
  263.  move.l 8(a1,d2.w),8(a1,d1.w)
  264.  movem.l d5-d7,0(a1,d2.w)
  265.  move.w 12(a1,d1.w),d5
  266.  move.w 12(a1,d2.w),12(a1,d1.w)
  267.  move.w d5,12(a1,d2.w)
  268.  exg.l d0,d5
  269.  addq.l #4,a2
  270.  subq.l #4,a3
  271.  add.w #14,d1
  272.  sub.w #14,d2
  273.  cmp.l a3,a2
  274.  ble.s l40
  275. l50:
  276.  cmp.l a5,a2
  277.  blt.s l52
  278. l51:
  279.  move.l a3,a5
  280.  cmp.l a5,d5
  281.  blt l30
  282.  tst.w d4
  283.  bge l20
  284.  rts
  285. l52:
  286.  addq.w #8,d4
  287.  move.l a2,0(a0,d4.w)
  288.  move.l a5,4(a0,d4.w)
  289.  bra.s l51
  290.  
  291. vector:                ; hier erfolgt die Hauptarbeit
  292.  bsr transform            ; Rotation + 3D-Projektion
  293.  bsr backs            ; Flächenrücken-Überprüfung
  294.  tst.w drawnum            ; keine Fläche zu sehen?
  295.  blt end            ; dann Ende
  296.  bsr quicksort            ; schneller Sortieralgorithmus
  297.  lea dttab(pc),a5        ; Tabelle mit Zeigern auf die sortierten,
  298.  lea $dff000,a6            ; verbleibenden Flächen
  299.  lea hix(pc),a1
  300.  move.w drawnum(pc),d7
  301. lp:
  302.  move.l (a5)+,a3        ; Flächen-Info-Adresse
  303.  move.l 6(a5),a2
  304.  move.w (a3)+,d5        ; Eckenzahl holen
  305.  lea 10(a5),a5            ; Zeiger auf nächste Fläche erhöhen
  306.  subq.w #1,d5
  307.  move.w (a3)+,-(a7)        ; Farbe auf Stack
  308.  moveq #-1,d0
  309.  move.w #640,2(a1)        ; Ausmaße für Füll- und Kopier-Fenster reseten
  310.  move.w d0,(a1)
  311.  move.w #640,6(a1)
  312.  move.w d0,4(a1)
  313.  move.w #0,line
  314.  lea scx1(pc),a4        ; Eintrag in Rechte-Rand-Clip löschen
  315.  move.l d0,(a4)
  316.  move.l d0,4(a4)
  317. linelp:
  318.  move.w (a3)+,d6        ; Eckpunktnummer aus Flächen-Info holen
  319.                                 ; (Startpunkt)
  320.  movem.w 0(a2,d6.w),d0-d1    ; entsprechende 2D-Koordinaten aus ttab holen
  321.  move.w (a3),d6
  322.  movem.w 0(a2,d6.w),d2-d3    ; Endpunkt holen
  323.  asr.w #4,d0            ; wieder durch 16 dividieren
  324.  asr.w #4,d1
  325.  asr.w #4,d2
  326.  asr.w #4,d3
  327.  bsr drawl            ; Clippen + Linie zeichnen
  328.  dbf d5,linelp            ; alle Linien einer Fläche?
  329.  tst.w scx1            ; wurde Eintrag in
  330.  blt.s noclip            ; Rechte-Rand-Clip gemacht?
  331.  tst.w scx2            ; ja -> Clip-Linie zeichnen
  332.  blt.s noclip
  333.  lea scx1(pc),a4
  334.  movem.w (a4),d0-d3
  335.  bsr.s drawl            ; Clip-Linie zeichnen
  336. noclip:                ; kein Rechte-Rand-Clip
  337.  tst.w line            ; gar keine Linie gezeichnet?
  338.  beq.s nodraw
  339.  bsr calcwindow            ; erhaltene Fill-/Copy-Fenster Maße umrechnen
  340.  move.w (a7)+,d4        ; Farbe holen
  341.  bsr copy
  342.  dbf d7,lp            ; alle Flächen?
  343. end:
  344.  rts
  345. nodraw:
  346.  move.w (a7)+,d4        ; Farbe holen
  347.  dbf d7,lp            ; alle Flächen
  348.  rts
  349.  
  350. drawl:                ; LINIE clippen + zeichnen
  351.  movem.l d4-d7/a5-a6,-(a7)
  352.  cmp.w d1,d3            ; weiter unten liegendes Koordinaten-Paar
  353.                  ; nach d2-d3
  354.  bge.s ec
  355.  exg.l d0,d2
  356.  exg.l d1,d3
  357. ec:
  358.  cmp.w 6(a1),d1            ; neues lo-y?
  359.  bge.s lyk
  360.  move.w d1,6(a1)
  361. lyk:
  362.  cmp.w 4(a1),d3            ; neues hi-y?
  363.  ble.s hyk
  364.  move.w d3,4(a1)
  365. hyk:
  366.  move.w d0,d4            ; höheres x nach d5
  367.  move.w d2,d5            ; niederes x nach d4
  368.  cmp.w d4,d5
  369.  bge.s ok13
  370.  exg.l d4,d5            ; d4/d6 ggf. austauschen
  371. ok13:
  372.  cmp.w 2(a1),d4            ; neues lo-x?
  373.  bge.s lxk
  374.  move.w d4,2(a1)
  375. lxk:
  376.  cmp.w (a1),d5            ; neues hi-x?
  377.  ble.s chky
  378.  move.w d5,(a1)
  379. chky:                ; Clipping, rechts zuerst
  380.  move.w #319,d6
  381.  cmp.w d6,d0            ; P1 rechts von rechter Kante
  382.  bgt.s ctx21            ; ja -> x = 319 und neues y
  383.  cmp.w d6,d2            ; P2 rechts von rechter Kante
  384.  bgt.w ctx22            ; ja -> x = 319 und neues y
  385.  moveq #0,d6
  386.  tst.w d1            ; P1 über Oberkante ?
  387.  bmi.s cty11            ; ja -> y = 0 und neues x
  388.  tst.w d3            ; P2 über Oberkante ?
  389.  bmi.s cty12            ; ja -> y = 0 und neues x
  390.  move.w #147,d6
  391.  cmp.w d6,d1            ; P1 unter Unterkante ?
  392.  bgt.s cty21            ; ja -> x = 147 und neues y
  393.  cmp.w d6,d3            ; P2 unter Unterkante ?
  394.  bgt.s cty22            ; ja -> x = 147 und neues y
  395. chkx:
  396.  moveq #0,d6
  397.  tst.w d0            ; P1 links von linker Kante ?
  398.  bmi.s ctx11            ; ja -> x = 0 und neues y
  399.  tst.w d2            ; P2 links von linker Kante ?
  400.  bmi.s ctx12            ; ja -> x = 0 und neues y
  401.  bra dline
  402. cty11:                ; Clip Oberkante
  403.  tst.w d3            ; auch P2 über Oberkante (-> Line unsichtbar) ?
  404.  bmi.s clpend
  405.  bsr.s clipy
  406.  move.w d4,d0            ; berechnete x-Koordinate
  407.  moveq #0,d1            ; y=0
  408.  bra chky            ; noch einmal überprüfen
  409. cty12:
  410.  bsr.s clipy            ; Clip Oberkante
  411.  move.w d4,d2            ; berechnete x-Koordinate
  412.  moveq #0,d3            ; y=0
  413.  bra chky
  414. cty21:                ; Clip Unterkante
  415.  cmp.w d6,d3            ; auch P2 unter Unterkante ?
  416.  bgt.s clpend
  417.  bsr.s clipy
  418.  move.w d4,d0            ; berechnete x-Koordinate
  419.  move.w d6,d1            ; y=147
  420.  bra chky
  421. cty22:                ; Clip Unterkante
  422.  bsr.s clipy
  423.  move.w d4,d2            ; berechnete x-Koordinate
  424.  move.w d6,d3            ; y=147
  425.  bra chky
  426. ctx11:                ; Clip linke Kante
  427.  tst.w d2            ; auch P2 links von linker Kante ?
  428.  bmi.s clpend
  429.  bsr.s clipx
  430.  move.w d4,d1            ; berechnete y-Koordinate
  431.  moveq #0,d0            ; x=0
  432.  bra chky
  433. ctx12:                ; Clip linke Kante
  434.  bsr.s clipx
  435.  move.w d4,d3            ; berechnete y-Koordinate
  436.  moveq #0,d2            ; x=0
  437.  bra chky
  438. ctx21:                ; Clip rechte Kante
  439.  cmp.w d6,d2            ; auch P2 rechts von rechter Kante ?
  440.  bgt.s clpend
  441.  bsr.s clipx
  442.  move.w d4,d1            ; berechnete y-Koordinate
  443.  move.w d6,d0            ; x=319
  444.  movem.w d0-d1,(a4)        ; Schnittpunkt mit rechter Kante merken
  445.  addq.l #4,a4
  446.  bra chky            ; noch einmal überprüfen
  447. ctx22:                ; Clip rechte Kante
  448.  bsr.s clipx
  449.  move.w d4,d3            ; berechnete y-Koordinate
  450.  move.w d6,d2            ; x=319
  451.  movem.w d2-d3,(a4)        ; Schnittpunkt mit rechter Kante merken
  452.  addq.l #4,a4
  453.  bra chky            ; noch einmal überprüfen
  454. clpend:                ; Linie unsichtbar
  455.  movem.l (a7)+,d4-d7/a5-a6
  456.  rts
  457. clipy:                ; yb bekannt (Unter-/Oberkante)
  458.  move.w d0,d4            ; xn berechnen
  459.  sub.w d2,d4            ; x' = x1-x2
  460.  move.w d3,d5
  461.  move.w d3,d7
  462.  sub.w d6,d7            ; y' = y2-yb
  463.  muls d7,d4            ; xn = x' * y'
  464.  sub.w d1,d5
  465.  divs d5,d4            ; xn = xn / (y2-y1)
  466.  add.w d2,d4            ; xn = xn + x2
  467.  rts
  468. clipx:                ; xb bekannt (Linke/Rechte Kante)
  469.  move.w d1,d4            ; yn berechnen
  470.  sub.w d3,d4            ; y' = y1-y2
  471.  move.w d2,d5
  472.  move.w d2,d7
  473.  sub.w d6,d7            ; x' = x2-xb
  474.  muls d7,d4            ; yn = x' * y'
  475.  sub.w d0,d5
  476.  divs d5,d4            ; yn = yn / (x2-x1)
  477.  add.w d3,d4            ; yn = yn + y2
  478.  rts
  479.  
  480. dline:                ; Hier wird gezeichnet
  481.  cmp.w d1,d3            ; Falls y1 = y2 -> Keine Linie,
  482.  beq drawend            ; da Blitter im Single-Mode
  483.  move.w d1,d5
  484.  move.w d1,d4
  485.  asl.w #5,d5
  486.  asl.w #3,d4
  487.  add.w d4,d5
  488.  move.l tmpadr(pc),a5        ; In Hilfs-Ebene zeichnen
  489.  lea 0(a5,d5.w),a5
  490.  move.w d0,d4
  491.  asr.w #4,d4
  492.  add.w d4,d4
  493.  lea 0(a5,d4.w),a5        ; Adresse für Prozessor-EOR
  494.  sub.w d0,d2
  495.  sub.w d1,d3
  496.  moveq #15,d5
  497.  and.l d5,d0
  498.  move.w d0,d4
  499.  ror.l #4,d0
  500.  eor.w d5,d4
  501.  moveq #0,d5
  502.  bset d4,d5            ; Genaues Bit für Prozessor-EOR
  503.  move.w #4,d0
  504.  tst.w d2
  505.  bpl.s d2g0
  506.  addq.w #1,d0
  507.  neg.w d2
  508. d2g0:
  509.  cmp.w d2,d3
  510.  ble.s d2gd3
  511.  exg.l d2,d3
  512.  subq.w #4,d0
  513.  add.w d0,d0
  514. d2gd3:
  515.  move.w d3,d4
  516.  sub.w d2,d4
  517.  add.w d4,d4
  518.  add.w d4,d4
  519.  add.w d3,d3
  520.  moveq #0,d6
  521.  move.w d3,d6
  522.  sub.w d2,d6
  523.  bpl.s d6gd2
  524.  or.w #16,d0
  525. d6gd2:
  526.  add.w d3,d3
  527.  add.w d0,d0
  528.  add.w d0,d0
  529.  addq.w #1,d2
  530.  asl.w #6,d2
  531.  addq.w #2,d2
  532.  swap d3
  533.  move.w d4,d3
  534.  or.l #$b4a0003,d0        ; EOR-MiniTerms + SING-Bit + Line-Bit
  535.  move.w #$4000,$9a(a6)        ; Interrupts wegen Blitter sperren (falls
  536.  wblt                ; im VBI Blitterzugriff erfolgt)
  537.  moveq #40,d1            ; Register für Line initialisieren
  538.  move.w d1,$60(a6)
  539.  move.w d1,$66(a6)
  540.  moveq #-1,d1
  541.  move.l d1,$44(a6)
  542.  move.w d1,$72(a6)
  543.  move.w #$8000,$74(a6)
  544.  eor.w d5,(a5)            ; Prozessor-EOR
  545.  move.l d3,$62(a6)
  546.  move.l a5,$48(a6)
  547.  move.l a5,$54(a6)
  548.  move.w d6,$52(a6)
  549.  move.l d0,$40(a6)
  550.  move.w d2,$58(a6)
  551.  move.w #$c000,$9a(a6)        ; Interrupts wieder freigeben
  552.  add.w #1,line
  553. drawend:
  554.  movem.l (a7)+,d4-d7/a5-a6
  555.  rts
  556.  
  557. calcwindow:            ; GRÖSSE des Fill-/Copy- Fensters
  558.  cmp.w #319,(a1)        ; in Adressen u. Modulo umrechnen
  559.  ble.s ok14
  560.  move.w #319,(a1)        ; Überprüfung auf Rand-Überschreitung
  561.  ok14:
  562.   tst 2(a1)
  563.   bge.s ok15            ; ...
  564.   move.w #0,2(a1)
  565.  ok15:
  566.   cmp.w #147,4(a1)
  567.   ble.s ok16
  568.   move.w #147,4(a1)
  569.  ok16:
  570.   tst.w 6(a1)
  571.   bge.s ok17
  572.   move.w #0,6(a1)
  573.  ok17:
  574.   move.w (a1),d0
  575.   asr.w #4,d0            ; x-Offset des Blitterfensters
  576.   asl.w #1,d0
  577.   move.w d0,woffx
  578.   asr.w #1,d0
  579.   move.w 2(a1),d1
  580.   asr.w #4,d1
  581.   sub.w d1,d0            ; x-Größe des Blitterfensters
  582.   addq.w #1,d0
  583.   move.w d0,wsizex
  584.   asl.w #1,d0
  585.   moveq #40,d1            ; Modulo
  586.   sub.w d0,d1            ; für temporäre
  587.   move.w d1,tmpmod        ; Hilfsebene
  588.   move.w 4(a1),d0
  589.   sub.w 6(a1),d0        ; y-Ausdehnung des Blitterfensters
  590.   addq.w #1,d0
  591.   move.w d0,wsizey
  592.   move.w 4(a1),d0
  593.   move.w d0,d1
  594.   asl.w #3,d0
  595.   asl.w #5,d1            ; y-Offset des Blitterfensters
  596.   add.w d1,d0
  597.   move.w d0,woffy
  598.   rts
  599.  
  600. transform:            ; TRANSFORMATION
  601.  lea objpd(pc),a2        ; 3D-Eckpunkt-Daten
  602.  lea ttab(pc),a3        ; Tabelle für 2D-Ergebnis-Daten
  603.  lea sintab(pc),a0        ; Zeiger auf Sinus-Tabelle
  604.  lea costab(pc),a1        ; Zeiger auf Cosinus-Tabelle
  605.  lea z2tab(pc),a4        ; Zwischen-Tabelle für 3D-Z-Koords der
  606.  moveq #15,d6            ; einzelnen Punkte
  607.  move.w (a2)+,d5
  608.  subq.w #1,d5            ; Eckenzahl - 1
  609. translp:
  610.  movem.w (a2)+,d0-d2        ; 3D-Koordinaten holen
  611.  asl.w #4,d0            ; Zwecks höherer Genauigkeit der
  612.  asl.w #4,d1            ; Rechnungen, Multiplikation mit 16
  613.  asl.w #4,d2
  614.  move.w rx(pc),d3        ; Rotation um x-Achse
  615.  move.w d1,d4
  616.  move.w d2,d7
  617.  muls 0(a1,d3.w),d1
  618.  muls 0(a0,d3.w),d2
  619.  sub.l d2,d1
  620.  asr.l d6,d1
  621.  muls 0(a0,d3.w),d4
  622.  muls 0(a1,d3.w),d7
  623.  add.l d7,d4
  624.  asr.l d6,d4
  625.  move.w d4,d2
  626.  move.w ry(pc),d3        ; Rotation um y-Achse
  627.  move.w d0,d4
  628.  move.w d2,d7
  629.  muls 0(a1,d3.w),d0
  630.  muls 0(a0,d3.w),d2
  631.  add.l d2,d0
  632.  asr.l d6,d0
  633.  neg.w d4
  634.  muls 0(a0,d3.w),d4
  635.  muls 0(a1,d3.w),d7
  636.  add.l d7,d4
  637.  asr.l d6,d4
  638.  move.w d4,d2
  639.  move.w rz(pc),d3        ; Rotation um z-Achse
  640.  move.w d0,d4
  641.  move.w d1,d7
  642.  muls 0(a1,d3.w),d0
  643.  muls 0(a0,d3.w),d1
  644.  sub.l d1,d0
  645.  asr.l d6,d0
  646.  muls 0(a0,d3.w),d4
  647.  muls 0(a1,d3.w),d7
  648.  add.l d7,d4
  649.  asr.l d6,d4
  650.  move.w d4,d1
  651.  move.w d2,(a4)+        ; z-Koordinate jedes einzelnen Echpunktes
  652.  ext.l d0            ; nach Zwischentabelle
  653.  ext.l d1
  654.  ext.l d2
  655.  add.l addx(pc),d0        ; Verschiebung addieren
  656.  add.l addy(pc),d1
  657.  add.l addz(pc),d2
  658.  beq.s ptjend
  659.  moveq #10,d3            ; Strahlensatz:
  660.  asl.l d3,d0            ;      f*x
  661.  asl.l d3,d1            ; x' = -
  662.  asr.l #3,d2            ;       z
  663.  divs d2,d0
  664.  divs d2,d1            ;        f*y
  665.  neg.w d0            ; y' = - -
  666.  add.w #160*16,d0        ;         z
  667.  add.w #74*16,d1        ; Zentrieren
  668. ptjend:
  669.  movem.w d0-d1,(a3)        ; und nach 2D-Tabelle speichern
  670.  addq.l #4,a3
  671.  dbf d5,translp
  672.  rts
  673.  
  674. backs:                ; FLÄCHENRÜCKEN-Überprüfung
  675.  lea objad(pc),a2
  676.  lea ttab(pc),a3
  677.  lea z2tab(pc),a1
  678.  lea ztab(pc),a0
  679.  lea dttab(pc),a4
  680.  move.w (a2)+,d7
  681.  subq.w #1,d7
  682. backslp:
  683.  move.w 4(a2),d5
  684.  movem.w 0(a3,d5.w),d0-d1    ; 2D-Koordinaten der drei ersten Punkte
  685.  move.w 6(a2),d5        ; (im Text D, E, F, genannt)
  686.  movem.w 0(a3,d5.w),d2-d3
  687.  move.w 8(a2),d5
  688.  movem.w 0(a3,d5.w),d4-d5
  689.  sub.w d0,d2            ; Daraus Vektoren
  690.  sub.w d1,d3            ; v
  691.  sub.w d0,d4            ; und
  692.  sub.w d1,d5            ; w berechnen
  693.  muls d2,d5            ; Multiplikation f+r
  694.  muls d3,d4            ; Vektorprodukt
  695.  sub.l d4,d5            ; und Subtraktion dazu
  696.  bmi.s notvisib            ; <0 -> nix sichtbar
  697.  move.w (a2),d6
  698.  subq.w #1,d6
  699.  moveq #4,d5
  700.  moveq #0,d1
  701. avlp:
  702.  move.w 0(a2,d5.w),d0        ; Addition der z-Koordinaten
  703.  asr.w #1,d0            ; der Eckpunkte aus der
  704.  add.w 0(a1,d0.w),d1        ; Zwischen-Tabelle ...
  705.  addq.w #2,d5
  706.  dbf d6,avlp
  707.  addq.w #1,drawnum
  708.  ext.l d1
  709.  divs (a2),d1            ; ... Division durch Anzahl der Eckpunkte
  710.  ext.l d1            ; zur Durchschnittsberechnung
  711.  add.l addz(pc),d1
  712.  move.l d1,(a0)+        ; In ztab zum Sortieren speichern.
  713.  move.l a2,(a4)+        ; Eintrag für sichtbare Fläche
  714.  addq.l #6,a4            ; in dttab anlegen (Zeiger auf
  715.  move.l a3,(a4)+        ; objad-Eintrag, ...)
  716. notvisib:
  717.  lea 22(a2),a2
  718.  dbf d7,backslp            ; alle Flächen?
  719.  subq.l #4,a0
  720.  move.l a0,zend            ; Ende von ztab (für Quicksort)
  721.  rts
  722.  
  723. copy:                ; FÜLLEN der Fläche in Hilfsebene
  724.  move.l tmpadr(pc),a0        ; + KOPIEREN in Hauptscreen
  725.  move.l pgh(pc),a1        ; + LÖSCHEN der Hilfsebene
  726.  moveq #0,d2
  727.  move.w woffx(pc),d2        ; berechnete Window-Werte holen
  728.  add.w woffy(pc),d2
  729.  add.l d2,a0
  730.  add.l d2,a1
  731.  move.w wsizey(pc),d2
  732.  asl.w #6,d2
  733.  add.w wsizex(pc),d2
  734.  move.w tmpmod(pc),d0
  735.  moveq #-1,d1
  736.  move.w #$4000,$9a(a6)
  737.  wblt
  738.  move.w d0,$62(a6)
  739.  move.w d0,$64(a6)
  740.  move.w d0,$66(a6)
  741.  move.l d1,$44(a6)
  742.  move.l a0,$50(a6)
  743.  move.l a0,$54(a6)
  744.  move.l #$9f00012,$40(a6)
  745.  move.w d2,$58(a6)        ; Füllen
  746.  move.l #$dfc0002,d1
  747.  moveq #0,d0
  748.  move.l #$f00000,d3        ; Wechseln für
  749. copylp:                ; löschend oder
  750.  btst d0,d4            ; setzend kopieren
  751.  bne.s ok18
  752.  sub.l d3,d1
  753. ok18:
  754.  wblt
  755.  move.l d1,$40(a6)
  756.  move.l a0,$50(a6)
  757.  move.l a1,$4c(a6)
  758.  move.l a1,$54(a6)
  759.  move.w d2,$58(a6)        ; Nach Farb-Wert in die
  760.  or.l d3,d1            ; drei Ebenen kopieren
  761.  lea 148*40(a1),a1
  762.  addq.w #1,d0
  763.  cmp.w #2,d0
  764.  ble.s copylp            ; Alle drei Ebenen?
  765.  wblt
  766.  move.l #$1000002,$40(a6)
  767.  move.l a0,$54(a6)
  768.  move.w d2,$58(a6)        ; Fläche in Hilfsebene
  769.  move.w #$c000,$9a(a6)        ; wieder löschen
  770.  rts
  771.  
  772. rotob:                ; BEARBEITUNG von "rottab"
  773.  subq.w #1,animcnt
  774.  bge.s endrot            ; Nur jeden dritten Aufruf
  775.  move.w #2,animcnt        ; abarbeiten
  776.  lea objpd(pc),a2
  777.  move.l rotptr(pc),a3
  778.  moveq #5,d6            ; sechs Einschnitte
  779. rotlp:
  780.  move.w 2(a2),d0
  781.  cmp.w (a3),d0            ; vorgegebenes x erreicht?
  782.  beq.s okx
  783.  blt.s lowx
  784.  subq.w #2,2(a2)        ; noch zu groß ->
  785.  bra.s okx            ; Verringerung um 8
  786. lowx:
  787.  addq.w #8,2(a2)        ; noch zu klein ->
  788. okx:                ; Vergrößerung um 8
  789.  move.w 4(a2),d0
  790.  cmp.w 2(a3),d0            ; vorgegebenes y erreicht?
  791.  beq.s oky
  792.  blt.s lowy
  793.  subq.w #8,4(a2)        ; noch zu groß ->
  794.  bra.s oky            ; Verringerung um 8
  795. lowy:
  796.  addq.w #8,4(a2)        ; noch zu klein ->
  797. oky:                ; Vergrößerung um 8
  798.  lea 8*6(a2),a2
  799.  addq.l #4,a3
  800.  dbf d6,rotlp
  801.  subq.w #1,rotcnt
  802.  bgt.s ok30            ; Darstellungszeit zu ende?
  803.  tst.w (a3)
  804.  bge.s ok20            ; "rottab" zu ende?
  805.  lea rottab(pc),a3
  806. ok20:
  807.  move.w (a3)+,rotcnt
  808.  move.l a3,rotptr
  809. ok30:
  810.  bsr.s dorot
  811. endrot
  812.  rts
  813.  
  814. dorot:                ; ermittelte Kontur des
  815.  lea sintab(pc),a0        ; Körpers dreidimensionalisieren
  816.  lea costab(pc),a1
  817.  lea objpd(pc),a2
  818.  moveq #5,d6            ; sechs Einschnitte
  819.  moveq #15,d7
  820.  addq.l #2,a2
  821. roto:
  822.  moveq #7,d5            ; Kreis in acht Abschnitte a 45°
  823.  moveq #0,d4            ; zerteilen
  824.  move.w (a2),d3            ; x-Koordinate
  825.  move.w 2(a2),d1        ; und y-Koordinate des Kontur-
  826. roti:                ; Einschnittes holen (y nur für movem)
  827.  move.w d3,d0
  828.  move.w d3,d2
  829.  muls 0(a1,d4.w),d0        ; x mit cos multiplizieren -> neu_x
  830.  muls 0(a0,d4.w),d2        ; x mit sin multiplizieren -> neu_z
  831.  asr.l d7,d0
  832.  asr.l d7,d2
  833.  movem d0-d2,(a2)        ; als 3D-Koords in "objpd" speichern
  834.  addq.l #6,a2
  835.  add.w #90,d4
  836.  dbf d5,roti
  837.  dbf d6,roto
  838.  rts
  839.  
  840. tmpadr dc.l 0
  841. screen dc.l 0
  842. vbi dc.w 0
  843. pgh dc.l 0             ; ******
  844. pgs dc.l 0
  845. addx dc.l 0            ; WICHTIG!!
  846. addy dc.l 0
  847. addz dc.l 0            ; Diese
  848. rx dc.w 0
  849. ry dc.w 0            ; Konstellation
  850. rz dc.w 0
  851.    dc.w 0            ; darf
  852. hix dc.w 0
  853. lox dc.w 0            ; unter
  854. hiy dc.w 0
  855. loy dc.w 0            ; keinen
  856. addxb dc.l 0
  857. addyb dc.l 0            ; Umständen
  858. addzb dc.l -25000    ; (Start-Z)
  859. rxb dc.w 0            ; geändert
  860. ryb dc.w 0
  861. rzb dc.w 0            ; werden
  862. scx1 dc.w 0            ; !!
  863. scy1 dc.w 0            ; !!
  864. scx2 dc.w 0            ; !!
  865. scy2 dc.w 0            ; ******
  866. zend dc.l 0
  867. wsizex dc.w 1
  868. wsizey dc.w 1
  869. woffx dc.w 0
  870. woffy dc.w 0
  871. tmpmod dc.w 0
  872. drawnum dc.w 0
  873. line dc.w 0
  874. animcnt dc.w 0
  875. oldvbi dc.l 0
  876. intena dc.w 0
  877. rotcnt dc.w 0
  878. rotptr dc.l 0
  879.  
  880. ttab:                ; Tabelle für 2D-Koordinaten
  881.  dcb.w 50*2
  882.  
  883. z2tab:                ; Zwischen-Tabelle für z-Koords jedes Punktes
  884.  dcb.w 50
  885.  cnop 0,4
  886.  
  887. ztab:                ; z-Koordinaten-Tabelle für Flächendurch-
  888.  dcb.l 50            ; schnitt (Sortieren)
  889.  
  890. dttab:                ; Tabelle mit Einträgen der sichtbaren Flächen
  891.  dcb.w 50*7
  892.  
  893. lrtab:                ; Hilfs-Tabelle für Quicksort
  894.  dcb.l 50
  895.  
  896. rottab:                ; Tabelle für Mutation des Körpers
  897.  dc.w 30            ; Dauer der Darstellung dieser Mutation
  898.  dc.w -$a*3,$40*3        ; x, y-Ziel für ersten Einschnitt
  899.  dc.w -$14*3,$28*3        ; x, y-Ziel für zweiten Einschnitt
  900.  dc.w -$40*3,$8*3        ; x, y-Ziel für dritten Einschnitt
  901.  dc.w -$40*3,-$8*3        ; x, y-Ziel für vierten Einschnitt
  902.  dc.w -$14*3,-$28*3        ; x, y-Ziel für fünften Einschnitt
  903.  dc.w -$a*3,-$40*3        ; x, y-Ziel für sechsten Einschnitt
  904.  dc.w 30            ; Dauer der Darstellung der nächsten Mutation
  905.  dc.w -$3a*3,$40*3
  906.  dc.w -$24*3,$20*3
  907.  dc.w -$10*3,$20*3
  908.  dc.w -$10*3,-$20*3
  909.  dc.w -$24*3,-$20*3
  910.  dc.w -$3a*3,-$40*3
  911.  dc.w 30
  912.  dc.w -$a*3,$40*3
  913.  dc.w -$34*3,$20*3
  914.  dc.w -$10*3,$20*3
  915.  dc.w -$10*3,-$20*3
  916.  dc.w -$34*3,-$20*3
  917.  dc.w -$a*3,-$40*3
  918.  dc.w 30
  919.  dc.w -$a*3,$28*3
  920.  dc.w -$34*3,$8*3
  921.  dc.w -$10*3,$8*3
  922.  dc.w -$10*3,-$8*3
  923.  dc.w -$34*3,-$8*3
  924.  dc.w -$a*3,-$28*3
  925.  dc.w 30
  926.  dc.w -$a*3,$40*3
  927.  dc.w -$14*3,$8*3
  928.  dc.w -$40*3,$8*3
  929.  dc.w -$40*3,-$8*3
  930.  dc.w -$14*3,-$8*3
  931.  dc.w -$a*3,-$40*3
  932.  dc.w 30
  933.  dc.w -$a*3,$40*3
  934.  dc.w -$3c*3,$28*3
  935.  dc.w -$50*3,$10*3
  936.  dc.w -$50*3,-$10*3
  937.  dc.w -$3c*3,-$28*3
  938.  dc.w -$a*3,-$40*3
  939.  dc.w 30
  940.  dc.w -$a*3,$8*3
  941.  dc.w -$3c*3,$28*3
  942.  dc.w -$50*3,$10*3
  943.  dc.w -$50*3,-$10*3
  944.  dc.w -$3c*3,-$28*3
  945.  dc.w -$a*3,-$8*3
  946.  dc.w 50
  947.  dc.w -$a*3,$40*3
  948.  dc.w -$24*3,$30*3
  949.  dc.w -$40*3,-$8*3
  950.  dc.w -$10*3,-$10*3
  951.  dc.w -$24*3,-$20*3
  952.  dc.w -$a*3,-$40*3
  953.  dc.w 50
  954.  dc.w -$a*3,$40*3
  955.  dc.w -$24*3,$20*3
  956.  dc.w -$8*3,-$10*3
  957.  dc.w -$20*3,-$10*3
  958.  dc.w -$24*3,-$20*3
  959.  dc.w -$a*3,-$40*3
  960.  dc.w 50
  961.  dc.w -$3a*3,$40*3
  962.  dc.w -$24*3,$20*3
  963.  dc.w -$20*3,$10*3
  964.  dc.w -$8*3,$10*3
  965.  dc.w -$c*3,-$20*3
  966.  dc.w -$3a*3,-$40*3
  967.  dc.w 50
  968.  dc.w -$a*3,$10*3
  969.  dc.w -$3c*3,$40*3
  970.  dc.w -$20*3,$10*3
  971.  dc.w -$8*3,$10*3
  972.  dc.w -$c*3,-$30*3
  973.  dc.w -$32*3,-$40*3
  974.  dc.w 50
  975.  dc.w -$a*3,$40*3
  976.  dc.w -$44*3,$20*3
  977.  dc.w -$8*3,$20*3
  978.  dc.w -$20*3,-$10*3
  979.  dc.w -$c*3,-$20*3
  980.  dc.w -$a*3,-$40*3
  981.  dc.w -1
  982.  
  983. objpd:                ; Eckpunkt-Tabelle
  984.  dc.w 6*8            ; Anzahl Eckpunkte
  985.  dc.w -$a*3,$40*3,0        ; x,y,z
  986.  dcb.w 7*3            ; sieben leer-x,y,z; werden von "dorot"
  987.  dc.w -$14*3,$28*3,0        ; beschrieben
  988.  dcb.w 7*3
  989.  dc.w -$40*3,$8*3,0
  990.  dcb.w 7*3
  991.  dc.w -$40*3,-$8*3,0
  992.  dcb.w 7*3
  993.  dc.w -$14*3,-$28*3,0
  994.  dcb.w 7*3
  995.  dc.w -$a*3,-$40*3,0
  996.  dcb.w 7*3
  997.  
  998. objad:        ; Flächen-Tabelle: Eckenzahl,Farbe, 9 mal Platz für Punkte
  999.  dc.w 2+8+8+8+8+8 ; Anzahl der Flächen
  1000.  dc.w 8,7,0*4,1*4,2*4,3*4,4*4,5*4,6*4,7*4,0*4
  1001.  dc.w 8,7,47*4,46*4,45*4,44*4,43*4,42*4,41*4,40*4,47*4
  1002.  
  1003.  dc.w 4,3,40*4,41*4,33*4,32*4,40*4,0,0,0,0
  1004.  dc.w 4,4,41*4,42*4,34*4,33*4,41*4,0,0,0,0
  1005.  dc.w 4,3,42*4,43*4,35*4,34*4,42*4,0,0,0,0
  1006.  dc.w 4,4,43*4,44*4,36*4,35*4,43*4,0,0,0,0
  1007.  dc.w 4,3,44*4,45*4,37*4,36*4,44*4,0,0,0,0
  1008.  dc.w 4,4,45*4,46*4,38*4,37*4,45*4,0,0,0,0
  1009.  dc.w 4,3,46*4,47*4,39*4,38*4,46*4,0,0,0,0
  1010.  dc.w 4,4,47*4,40*4,32*4,39*4,47*4,0,0,0,0
  1011.  
  1012.  dc.w 4,3,8*4,9*4,1*4,0*4,8*4,0,0,0,0
  1013.  dc.w 4,4,9*4,10*4,2*4,1*4,9*4,0,0,0,0
  1014.  dc.w 4,3,10*4,11*4,3*4,2*4,10*4,0,0,0,0
  1015.  dc.w 4,4,11*4,12*4,4*4,3*4,11*4,0,0,0,0
  1016.  dc.w 4,3,12*4,13*4,5*4,4*4,12*4,0,0,0,0
  1017.  dc.w 4,4,13*4,14*4,6*4,5*4,13*4,0,0,0,0
  1018.  dc.w 4,3,14*4,15*4,7*4,6*4,14*4,0,0,0,0
  1019.  dc.w 4,4,15*4,8*4,0*4,7*4,15*4,0,0,0,0
  1020.  
  1021.  dc.w 4,2,16*4,17*4,9*4,8*4,16*4,0,0,0,0
  1022.  dc.w 4,1,17*4,18*4,10*4,9*4,17*4,0,0,0,0
  1023.  dc.w 4,2,18*4,19*4,11*4,10*4,18*4,0,0,0,0
  1024.  dc.w 4,1,19*4,20*4,12*4,11*4,19*4,0,0,0,0
  1025.  dc.w 4,2,20*4,21*4,13*4,12*4,20*4,0,0,0,0
  1026.  dc.w 4,1,21*4,22*4,14*4,13*4,21*4,0,0,0,0
  1027.  dc.w 4,2,22*4,23*4,15*4,14*4,22*4,0,0,0,0
  1028.  dc.w 4,1,23*4,16*4,8*4,15*4,23*4,0,0,0,0
  1029.  
  1030.  dc.w 4,5,24*4,25*4,17*4,16*4,24*4,0,0,0,0
  1031.  dc.w 4,6,25*4,26*4,18*4,17*4,25*4,0,0,0,0
  1032.  dc.w 4,5,26*4,27*4,19*4,18*4,26*4,0,0,0,0
  1033.  dc.w 4,6,27*4,28*4,20*4,19*4,27*4,0,0,0,0
  1034.  dc.w 4,5,28*4,29*4,21*4,20*4,28*4,0,0,0,0
  1035.  dc.w 4,6,29*4,30*4,22*4,21*4,29*4,0,0,0,0
  1036.  dc.w 4,5,30*4,31*4,23*4,22*4,30*4,0,0,0,0
  1037.  dc.w 4,6,31*4,24*4,16*4,23*4,31*4,0,0,0,0
  1038.  
  1039.  dc.w 4,2,32*4,33*4,25*4,24*4,32*4,0,0,0,0
  1040.  dc.w 4,1,33*4,34*4,26*4,25*4,33*4,0,0,0,0
  1041.  dc.w 4,2,34*4,35*4,27*4,26*4,34*4,0,0,0,0
  1042.  dc.w 4,1,35*4,36*4,28*4,27*4,35*4,0,0,0,0
  1043.  dc.w 4,2,36*4,37*4,29*4,28*4,36*4,0,0,0,0
  1044.  dc.w 4,1,37*4,38*4,30*4,29*4,37*4,0,0,0,0
  1045.  dc.w 4,2,38*4,39*4,31*4,30*4,38*4,0,0,0,0
  1046.  dc.w 4,1,39*4,32*4,24*4,31*4,39*4,0,0,0,0
  1047.  
  1048. ; Neue Sinus/Cosinus-Tabelle:
  1049. ; -$8000 bis $7fff
  1050.  
  1051. sintab DC.W 0,$23B,$477,$6B2,$8ED,$B27,$D61,$F99
  1052.        DC.W $11D0,$1405,$1639,$186C,$1A9C,$1CCA,$1EF7,$2120
  1053.        DC.W $2347,$256C,$278D,$29AB,$2BC6,$2DDE,$2FF2,$3203
  1054.        DC.W $340F,$3617,$381C,$3A1B,$3C17,$3E0D,$3FFF,$41EC
  1055.        DC.W $43D3,$45B6,$4793,$496A,$4B3B,$4D07,$4ECD,$508C
  1056.        DC.W $5246,$53F9,$55A5,$574B,$58E9,$5A81,$5C12,$5D9C
  1057.        DC.W $5F1E,$6099,$620C,$6378,$64DC,$6638,$678D,$68D9
  1058.        DC.W $6A1D,$6B58,$6C8C,$6DB6,$6ED9,$6FF2,$7103,$720B
  1059.        DC.W $730A,$7400,$74EE,$75D2,$76AD,$777E,$7846,$7905
  1060.        DC.W $79BB,$7A67,$7B09,$7BA2,$7C31,$7CB7,$7D32,$7DA4
  1061.        DC.W $7E0D,$7E6B,$7EC0,$7F0A,$7F4B,$7F82,$7FAF,$7FD2
  1062.        DC.W $7FEB,$7FFA
  1063. costab DC.W $7FFF,$7FFA,$7FEB,$7FD2,$7FAF,$7F82
  1064.        DC.W $7F4B,$7F0A,$7EC0,$7E6B,$7E0D,$7DA4,$7D32,$7CB7
  1065.        DC.W $7C31,$7BA2,$7B09,$7A67,$79BB,$7905,$7846,$777E
  1066.        DC.W $76AD,$75D2,$74EE,$7400,$730A,$720B,$7103,$6FF2
  1067.        DC.W $6ED9,$6DB6,$6C8B,$6B58,$6A1D,$68D9,$678D,$6638
  1068.        DC.W $64DC,$6378,$620C,$6099,$5F1E,$5D9C,$5C12,$5A81
  1069.        DC.W $58E9,$574B,$55A5,$5EF9,$5246,$508C,$4ECD,$4D07
  1070.        DC.W $4B3B,$496A,$4793,$45B6,$43D3,$41EC,$3FFF,$3E0D
  1071.        DC.W $3C17,$3A1B,$381C,$3618,$340F,$3203,$2FF2,$2DDE
  1072.        DC.W $2BC7,$29AB,$278D,$256C,$2347,$2120,$1EF7,$1CCB
  1073.        DC.W $1A9C,$186C,$163A,$1406,$11D0,$F99,$D61,$B27
  1074.        DC.W $8ED,$6B3,$477,$23C,0,$FDC5,$FB89,$F94E
  1075.        DC.W $F713,$F4D9,$F2A0,$F067,$EE30,$EBFB,$E9C7,$E794
  1076.        DC.W $E564,$E336,$E10A,$DEE0,$DCB9,$DA95,$D873,$D655
  1077.        DC.W $D43A,$D222,$D00E,$CDFE,$CBF1,$C9E9,$C7E5,$C5E5
  1078.        DC.W $C3EA,$C1F3,$C001,$BE14,$BC2D,$BA4B,$B86E,$B696
  1079.        DC.W $B4C5,$B2F9,$B133,$AF74,$ADBB,$AC08,$AA5B,$A8B6
  1080.        DC.W $A717,$A57F,$A3EE,$A264,$A0E2,$9F67,$9DF4,$9C88
  1081.        DC.W $9B24,$99C8,$9874,$9728,$95E4,$94A8,$9375,$924A
  1082.        DC.W $9128,$900E,$8EFD,$8DF5,$8CF6,$8C00,$8B13,$8A2E
  1083.        DC.W $8954,$8882,$87BA,$86FB,$8645,$8599,$84F7,$845E
  1084.        DC.W $83CF,$8349,$82CE,$825C,$81FE,$8195,$8140,$80F6
  1085.        DC.W $80B5,$807E,$8051,$802E,$8015,$8006,$8001,$8006
  1086.        DC.W $8015,$802E,$8051,$807E,$80B5,$80F6,$8140,$8195
  1087.        DC.W $81F3,$825B,$82CD,$8349,$83CF,$845E,$84F7,$8599
  1088.        DC.W $8645,$86FB,$87B9,$8882,$8953,$8A2E,$8B12,$8BFF
  1089.        DC.W $8CF5,$8DF5,$8EFD,$900E,$9127,$9249,$9374,$94A7
  1090.        DC.W $95E3,$9727,$9873,$99C7,$9B23,$9C87,$9DF3,$9F67
  1091.        DC.W $A0E1,$A264,$A3ED,$A57E,$A716,$A8B5,$AA5B,$AC07
  1092.        DC.W $ADBA,$AF73,$B133,$B2F8,$B4C4,$B696,$B86D,$BA4A
  1093.        DC.W $BC2C,$BE14,$C000,$C1F2,$C3E9,$C5E4,$C7E4,$C9E8
  1094.        DC.W $CBF0,$CDFD,$D00D,$D221,$D439,$D654,$D872,$DA94
  1095.        DC.W $DCB8,$DEDF,$E109,$E335,$E563,$E794,$E9C6,$EBFA
  1096.        DC.W $EE30,$F066,$F29F,$F4D8,$F712,$F49D,$FB88,$FDC4
  1097. sinend DC.W 0,$23B,$477,$6B2,$8ED,$B27,$D61,$F99
  1098.        DC.W $11D0,$1405,$1639,$186C,$1A9C,$1CCA,$1EF7,$2120
  1099.        DC.W $2347,$256C,$278D,$29AB,$2BC6,$2DDE,$2FF2,$3203
  1100.        DC.W $340F,$3617,$381C,$3A1B,$3C17,$3E0D,$3FFF,$41EC
  1101.        DC.W $43D3,$45B6,$4793,$496A,$4B3B,$4D07,$4ECD,$508C
  1102.        DC.W $5246,$53F9,$55A5,$574B,$58E9,$5A81,$5C12,$5D9C
  1103.        DC.W $5F1E,$6099,$620C,$6378,$64DC,$6638,$678D,$68D9
  1104.        DC.W $6A1D,$6B58,$6C8C,$6DB6,$6ED9,$6FF2,$7103,$720B
  1105.        DC.W $730A,$7400,$74EE,$75D2,$76AD,$777E,$7846,$7905
  1106.        DC.W $79BB,$7A67,$7B09,$7BA2,$7C31,$7CB7,$7D32,$7DA4
  1107.        DC.W $7E0D,$7E6B,$7EC0,$7F0A,$7F4B,$7F82,$7FAF,$7FD2
  1108.        DC.W $7FEB,$7FFA
  1109. cosend
  1110.  
  1111. gfxname dc.b "graphics.library",0
  1112.  
  1113.    section copperlist,data_c
  1114.  
  1115. copperlist:
  1116.  dc.w $2001,-2
  1117.  dc.w $1fc,0000,$106,000
  1118.  dc.w $180,$000,$182,$0a0,$184,$080
  1119.  dc.w $186,$00c,$188,$00a,$18a,$a0a
  1120.  dc.w $18c,$808,$18e,$00f
  1121.  dc.w $5e01,-2,$180,$05a
  1122.  dc.w $5f01,-2,$180,$07c
  1123.  dc.w $6001,-2,$180,$0af
  1124.  dc.w $6101,-2,$180,$05a
  1125.  dc.w $620f,-2,$96,$8100,$180,0
  1126. page:
  1127.  dc.w $e0,0,$e2,0,$e4,0,$e6,0,$e8,0,$ea,0
  1128.  dc.w $f601,-2,$96,$100,$180,$05a
  1129.  dc.w $f701,-2,$180,$0af
  1130.  dc.w $f801,-2,$180,$07c
  1131.  dc.w $f901,-2,$180,$05a
  1132.  dc.w $fa01,-2,$180,0
  1133.  dc.w -1,-2
  1134.